﻿/// <reference path="ext-all-debug.js" />


///
/// De esta clase se heredara para que obtengamos las funcionalidades basicas de un ABM.
/// Esta clase nos dara un marco, con botones para agregar, editar, borrar, exportar.
/// Automaticamente llamara a los diferentes handlers definidos en el archivo Model.js
/// Esta clase tambien nos brindara con algunos eventos para un mejor manejo de los datos o para agregarle funcionalidad al ABM que estemos creando.
/// Los Eventos que se brinda esta clase son los siguientes:
/// Creando: Se dispara al apretar el boton de Agregar un registro. como parametro recibe un objeto, que tiene un propiedad record que hace referencia al registro creado al apretar el boton.
/// Editando: Se dispara al empezar a Editar un registro (tanto apretando el boton o haciendo doble clic sobre el registro). como parametro recibe un objeto, que tiene un propiedad record que hace referencia al registro seleccionado.
/// Actualizando: Se dispara antes de Enviar los datos al servidor. Si el controlador del evento devuelve false, la ejecucion se cancelara y los datos no se sincronizaran. como parametro recibe un objeto, que tiene un propiedad record que hace referencia al registro creado/modificando.
/// Actualizado: Se dispara cuando obtenemos una respuesta desde el servidor. Si el controlador del evento devuelve false se va a evitar que se cierre la ventana luego, si se devuelve true las ventana se cerrara y la grilla se refrescara. como parametro recibe un objeto, que tiene un propiedad record que hace referencia al registro creado/modificando, tambien tiene otra propiedad success que indica si la ejecucion se realizo con exito.
/// Eliminando: Se dispara antes de Enviar la llamada al servidor para borrar el registro.  Si el controlador del evento devuelve false, la ejecucion se cancelara y el registro no se borrara. como parametro recibe un objeto, que tiene un propiedad record que hace referencia al registro que se borrara.
/// Eliminado: Se dispara cuando obtenemos una respuesta desde el servidor. Como parametro recibe un objeto, que tiene un propiedad record que hace referencia al registro eliminiado, tambien tiene otra propiedad success que indica si la ejecucion se realizo con exito
///
///
/// Luego hay propiedades que tendremos que sobreescribir en los objetos en los cuales vayamos Heredando.
/// Title: El titulo del panel en el que se crearan la grilla y demas controles.
/// Columns: Hace referencia a las columnas de la grilla.
/// Model: Hace referencia al Modelo que se utilizara para dicha grilla (Model.js)
/// defaultPropertySort: La propiedad la cual se va a utilizar para ordenar la grilla en la primera vez que se carga.
/// WindowPanel: El panel que se va a mostrar dentro de la ventana cuando se abre al agregar o modificar un registro.
///
/// GetNum: Es una funcion que obtiene como parametro el nombre del talonario en el cual vamos a crear un registro y nos devuelve el numero de ese talonario.
///

Ext.define('ABMBase', {
    extend: 'FormBase',
    Title: 'Untitled',
    Model: '',
    Columns: [],
    defaultPropertySort: '',
    WindowPanel: [],
    events: ['Creando', 'Editando', 'Actualizando', 'Actualizado', 'Eliminando', 'Eliminado'],
    ShowEditor: function () {
        var wMain = Ext.create('Ext.window.Window', {
            id: 'mainWindow',
            autoHeight: true,
            maxHeight: Ext.getBody().getHeight() - 100,
            width: 600,
            layout: 'fit',
            autoDestroy: true,
            modal: true,
            closable: false,
            closeAction: 'destroy',
            resizable: false,
            items: [{
                xtype: 'form',
                layout: 'form',
                frame: true,
                id: 'formWindow',
                monitorValid: true,
                autoDestroy: true,
                overflowY: 'auto',
                bodyStyle: {
                    "padding-right": '20px'
                },
                buttons: [{
                    id: 'btnFormWindowAceptar',
                    text: 'Aceptar',
                    iconCls: 'boton-Aceptar',
                    formBind: true,
                    handler: function () {
                        Ext.getCmp('formWindow').getEl().mask("Por favor, espere...");
                        Ext.getCmp('formWindow').getForm().updateRecord(Ext.getCmp('formWindow').getRecord());
                        if (activeInstance.fireEvent('Actualizando', { record: Ext.getCmp('formWindow').getRecord() }) === false)
                            return;
                        Ext.getCmp('mainGrid').getStore().sync({
                            success: function (btc, opt) {
                                if (activeInstance.fireEvent('Actualizado', { success: true, record: Ext.getCmp('formWindow').getRecord() }) === false) {
                                    return;
                                }
                                Ext.getCmp('mainGrid').getStore().reload();
                                Ext.getCmp('formWindow').getEl().unmask();
                                wMain.close();
                            },
                            failure: function (btc, opt) {
                                Ext.getCmp('formWindow').getEl().unmask();
                                if (activeInstance.fireEvent('Actualizado', { success: false, record: Ext.getCmp('formWindow').getRecord() }) === false) {
                                    return;
                                }
                                ShowError(btc.exceptions[0].getError());
                            }
                        });
                    }
                }, {
                    id: 'btnFormWindowCancelar',
                    text: 'Cancelar',
                    iconCls: 'boton-Cancelar',
                    handler: function () {
                        Ext.getCmp('mainGrid').getStore().rejectChanges();
                        wMain.close();
                    }
                }],
                items: this.WindowPanel
            }]
        });
        wMain.show();

    },
    init: function () {
        activeInstance.permisos = this.ObtenerPermisos();
        activeInstance.Buttons = [(activeInstance.permisos.Alta) ? {
            text: 'Agregar',
            iconCls: 'boton-Agregar',
            handler: function () {
                activeInstance.ShowEditor();
                var rcd = Ext.getCmp('mainGrid').getStore().model.create();
                activeInstance.fireEvent('Creando', { record: rcd });
                Ext.getCmp('mainGrid').getStore().add(rcd);
                Ext.getCmp('formWindow').loadRecord(rcd);
            }
        } : null, (activeInstance.permisos.Modificacion) ? {
            text: 'Editar',
            iconCls: 'boton-Editar',
            handler: function () {
                activeInstance.EditRecord();
            }
        } : null, (activeInstance.permisos.Baja) ? {
            text: 'Elminar',
            iconCls: 'boton-Borrar',
            handler: function () {
                Ext.Msg.confirm('¿Confirma?', '¿Desea borrar el registro seleccionado?', function (bId) {
                    if (bId == 'yes') {
                        if (Ext.getCmp('mainGrid').getSelectionModel().getSelection().length > 0) {
                            if (activeInstance.fireEvent('Eliminando', { record: Ext.getCmp('mainGrid').getSelectionModel().getSelection()[0] }) === false)
                                return;
                            Ext.getCmp('mainGrid').getStore().remove(Ext.getCmp('mainGrid').getSelectionModel().getSelection()[0]);
                            Ext.getCmp('mainGrid').getStore().sync({
                                success: function (btc, opt) {
                                    activeInstance.fireEvent('Eliminado', { success: true, record: Ext.getCmp('mainGrid').getSelectionModel().getSelection()[0] });
                                    Ext.getCmp('mainGrid').getStore().reload();
                                },
                                failure: function (btc, opt) {
                                    activeInstance.fireEvent('Eliminado', { success: false, record: Ext.getCmp('mainGrid').getSelectionModel().getSelection()[0] });
                                    ShowError(btc.exceptions[0].getError());
                                }
                            });
                        }
                    }
                });
            }
        } : null, {
            text: 'Exportar',
            iconCls: 'boton-Descargar',
            handler: function () {
                var dict = CreateForeignStore('exportStore', Ext.getCmp('mainGrid').getStore().model);
                dict.load({
                    params: {
                        filter: Ext.getCmp('mainGrid').filters.buildQuery(Ext.getCmp('mainGrid').filters.getFilterData()).filter
                    },
                    start: 0,
                    limit: -1,
                    callback: function () {
                        var data = Ext.ux.exporter.Exporter.exportAny(dict);
                        activeInstance.DescargarExcel(data);
                    }
                });
            }
        }, {
            text: 'Ayuda',
            iconCls: 'boton-Ayuda',
            handler: function () {
                Ext.MessageBox.show({
                    title: 'Ayuda',
                    msg: activeInstance.EjecutarEnServidor('ObtenerAyuda'),
                    buttons: Ext.Msg.OK,
                    autoScroll: true
                }).setOverflowXY('hidden', 'auto');
            }
        }];
        activeInstance.Items = [{
            id: 'mainGrid',
            xtype: 'gridpanel',
            flex: 1,
            width: '100%',
            features: [{
                ftype: 'filters',
                encode: true,
                local: false
            }],
            store: Ext.create('Ext.data.Store', {
                storeId: 'mainStore',
                autoLoad: true,
                model: this.Model,
                remoteSort: true,
                sorters: [{
                    property: this.defaultPropertySort,
                    direction: 'ASC'
                }]
            }),
            bbar: [{
                xtype: 'pagingtoolbar',
                store: Ext.StoreMgr.get('mainStore'),
                dock: 'bottom',
                displayInfo: true
            }],
            listeners: {
                celldblclick: function () {
                    activeInstance.EditRecord();
                }
            },
            columns: this.Columns
        }];
        return this.callParent();
    },
    EditRecord: function () {
        if (!activeInstance.permisos.Modificacion)
            return;
        if (Ext.getCmp('mainGrid').getSelectionModel().getSelection().length > 0) {
            activeInstance.ShowEditor();
            Ext.getCmp('mainWindow').items.items[0].cascade(function (itm) {
                if (itm instanceof Ext.form.field.Base) {
                    if (itm.isPrimaryKey) {
                        itm.setReadOnly(true);
                    }
                }
            });
            Ext.getCmp('mainGrid').getSelectionModel().getSelection()[0].setDirty();
            activeInstance.fireEvent('Editando', { record: Ext.getCmp('mainGrid').getSelectionModel().getSelection()[0] });
            Ext.getCmp('formWindow').loadRecord(Ext.getCmp('mainGrid').getSelectionModel().getSelection()[0]);
        }
    }
});